﻿2026-05-16T02:29:12.8663417Z ##[group]Run pnpm verify:phase-5
2026-05-16T02:29:12.8663782Z [36;1mpnpm verify:phase-5[0m
2026-05-16T02:29:12.8698609Z shell: /usr/bin/bash -e {0}
2026-05-16T02:29:12.8698861Z env:
2026-05-16T02:29:12.8699109Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-16T02:29:12.8699433Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-16T02:29:12.8699656Z   SKIP_TRACE_CHECK: 1
2026-05-16T02:29:12.8699858Z ##[endgroup]
2026-05-16T02:29:13.1881540Z 
2026-05-16T02:29:13.1882652Z > rebno@0.0.0 verify:phase-5 /home/runner/work/rebno/rebno
2026-05-16T02:29:13.1883809Z > node scripts/verify-phase-5.mjs
2026-05-16T02:29:13.1884438Z 
2026-05-16T02:29:13.2239216Z 
2026-05-16T02:29:13.2240074Z === Phase 4 carry-over: verify-phase-4 ===
2026-05-16T02:29:13.2241225Z >>> pnpm verify:phase-4
2026-05-16T02:29:13.5757563Z 
2026-05-16T02:29:13.5758985Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-16T02:29:13.5760220Z > node scripts/verify-phase-4.mjs
2026-05-16T02:29:13.5760845Z 
2026-05-16T02:29:13.6128802Z 
2026-05-16T02:29:13.6148996Z === Workspace: typecheck ===
2026-05-16T02:29:13.6158959Z >>> pnpm -r typecheck
2026-05-16T02:29:13.9932151Z Scope: 5 of 6 workspace projects
2026-05-16T02:29:13.9991688Z packages/db typecheck$ tsc --noEmit
2026-05-16T02:29:14.0000887Z packages/game-logic typecheck$ tsc --noEmit
2026-05-16T02:29:16.7069763Z packages/game-logic typecheck: Done
2026-05-16T02:29:16.7147932Z packages/protocol typecheck$ tsc --noEmit
2026-05-16T02:29:19.0862348Z packages/db typecheck: Done
2026-05-16T02:29:20.4790416Z packages/protocol typecheck: Done
2026-05-16T02:29:20.4797843Z apps/server typecheck$ tsc --noEmit
2026-05-16T02:29:20.4801087Z apps/client typecheck$ tsc --noEmit
2026-05-16T02:29:33.5638545Z apps/client typecheck: Done
2026-05-16T02:29:34.1790337Z apps/server typecheck: Done
2026-05-16T02:29:34.1893783Z 
2026-05-16T02:29:34.1894606Z === Lint: protocol-sync ===
2026-05-16T02:29:34.1895462Z >>> pnpm lint:protocol-sync
2026-05-16T02:29:34.5133622Z 
2026-05-16T02:29:34.5134797Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-16T02:29:34.5136297Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-16T02:29:34.5136938Z 
2026-05-16T02:29:34.5467469Z lint-protocol-sync: OK
2026-05-16T02:29:34.5601205Z 
2026-05-16T02:29:34.5601991Z === Lint: game-logic-purity ===
2026-05-16T02:29:34.5602834Z >>> pnpm lint:game-logic-purity
2026-05-16T02:29:34.8827567Z 
2026-05-16T02:29:34.8828685Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-16T02:29:34.8829643Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-16T02:29:34.8830046Z 
2026-05-16T02:29:34.9161888Z lint-game-logic-purity: OK (8 file(s) clean)
2026-05-16T02:29:34.9290974Z 
2026-05-16T02:29:34.9291741Z === Lint: better-auth-schema-sync ===
2026-05-16T02:29:34.9292726Z >>> pnpm lint:better-auth-schema-sync
2026-05-16T02:29:35.2483074Z 
2026-05-16T02:29:35.2484280Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-16T02:29:35.2485551Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-16T02:29:35.2486279Z 
2026-05-16T02:29:36.8080340Z lint-better-auth-schema-sync: OK
2026-05-16T02:29:36.8201574Z 
2026-05-16T02:29:36.8202278Z === Lint: rate-limit-budgets ===
2026-05-16T02:29:36.8203076Z >>> pnpm lint:rate-limit-budgets
2026-05-16T02:29:37.1373541Z 
2026-05-16T02:29:37.1374624Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-16T02:29:37.1375735Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-16T02:29:37.1376796Z 
2026-05-16T02:29:37.1692229Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-16T02:29:37.1823206Z 
2026-05-16T02:29:37.1823913Z === Lint: no-clipboard-rce ===
2026-05-16T02:29:37.1824781Z >>> pnpm lint:no-clipboard-rce
2026-05-16T02:29:37.5188792Z 
2026-05-16T02:29:37.5199420Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-16T02:29:37.5229137Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-16T02:29:37.5237346Z 
2026-05-16T02:29:37.5580810Z lint-no-clipboard-rce: OK (22 file(s) clean)
2026-05-16T02:29:37.5709450Z 
2026-05-16T02:29:37.5710140Z === Lint: room-layout ===
2026-05-16T02:29:37.5711057Z >>> pnpm lint:room-layout
2026-05-16T02:29:37.8917250Z 
2026-05-16T02:29:37.8918754Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-16T02:29:37.8919967Z > node tools/scripts/lint-room-layout.mjs
2026-05-16T02:29:37.8920586Z 
2026-05-16T02:29:37.9287526Z lint-room-layout: OK
2026-05-16T02:29:37.9418372Z 
2026-05-16T02:29:37.9419353Z === ADR 0004 lint ===
2026-05-16T02:29:37.9420355Z >>> pnpm lint:adr:0004
2026-05-16T02:29:38.2797159Z 
2026-05-16T02:29:38.2798494Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-16T02:29:38.2800112Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-16T02:29:38.2801102Z 
2026-05-16T02:29:38.3135160Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-16T02:29:38.3264221Z 
2026-05-16T02:29:38.3264963Z === Drizzle: emit-check ===
2026-05-16T02:29:38.3265901Z >>> pnpm db:emit-check
2026-05-16T02:29:38.6469018Z 
2026-05-16T02:29:38.6470187Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-16T02:29:38.6473326Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-16T02:29:38.6475520Z 
2026-05-16T02:29:39.1221642Z No config path provided, using default 'drizzle.config.ts'
2026-05-16T02:29:39.1224061Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-16T02:29:39.5034003Z 8 tables
2026-05-16T02:29:39.5034872Z accounts 8 columns 1 indexes 0 fks
2026-05-16T02:29:39.5035846Z audit_log 6 columns 0 indexes 2 fks
2026-05-16T02:29:39.5036815Z characters 9 columns 0 indexes 1 fks
2026-05-16T02:29:39.5037702Z inventory_items 4 columns 0 indexes 1 fks
2026-05-16T02:29:39.5039049Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-16T02:29:39.5039912Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-16T02:29:39.5040872Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-16T02:29:39.5041735Z sessions 5 columns 0 indexes 1 fks
2026-05-16T02:29:39.5042291Z 
2026-05-16T02:29:39.5043202Z No schema changes, nothing to migrate 😴
2026-05-16T02:29:39.6155071Z 
2026-05-16T02:29:39.6155942Z === Drizzle: schema-sync ===
2026-05-16T02:29:39.6156903Z >>> pnpm lint:schema-sync
2026-05-16T02:29:39.9397067Z 
2026-05-16T02:29:39.9398396Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-16T02:29:39.9402010Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-16T02:29:39.9404878Z 
2026-05-16T02:29:39.9674886Z OK
2026-05-16T02:29:39.9819332Z 
2026-05-16T02:29:39.9820235Z === Drizzle: source-comments ===
2026-05-16T02:29:39.9821160Z >>> pnpm lint:source-comments
2026-05-16T02:29:40.2989732Z 
2026-05-16T02:29:40.2990888Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-16T02:29:40.2992123Z > pnpm -C packages/db run lint:source-comments
2026-05-16T02:29:40.2992845Z 
2026-05-16T02:29:40.6250557Z 
2026-05-16T02:29:40.6252294Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-16T02:29:40.6253711Z > node scripts/check-source-comments.mjs
2026-05-16T02:29:40.6254325Z 
2026-05-16T02:29:40.6598567Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-16T02:29:40.6838990Z 
2026-05-16T02:29:40.6839985Z === Workspace: test ===
2026-05-16T02:29:40.6840827Z >>> pnpm -r test
2026-05-16T02:29:41.0082882Z Scope: 5 of 6 workspace projects
2026-05-16T02:29:41.0141885Z packages/db test$ vitest run
2026-05-16T02:29:41.0151195Z packages/game-logic test$ vitest run
2026-05-16T02:29:41.5490675Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-16T02:29:41.5509646Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-16T02:29:41.9694305Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-16T02:29:42.2500488Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-16T02:29:42.4873428Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-16T02:29:42.5630372Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-16T02:29:42.7542321Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T02:29:42.8099430Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T02:29:43.0077835Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T02:29:43.2387346Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T02:29:43.4731178Z packages/game-logic test:  [32m✓[39m test/sprite-state-machine.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T02:29:43.7040439Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T02:29:43.7095564Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T02:29:43.7112219Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-16T02:29:43.7145619Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-16T02:29:43.7174111Z packages/db test: [2m   Start at [22m 02:29:41
2026-05-16T02:29:43.7199721Z packages/db test: [2m   Duration [22m 2.15s[2m (transform 195ms, setup 0ms, import 1.49s, tests 34ms, environment 1ms)[22m
2026-05-16T02:29:43.7499089Z packages/db test: Done
2026-05-16T02:29:43.7518704Z packages/protocol test$ vitest run
2026-05-16T02:29:43.9377779Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T02:29:44.1756522Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T02:29:44.3530790Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-16T02:29:44.4302015Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T02:29:44.4390262Z packages/game-logic test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-16T02:29:44.4426931Z packages/game-logic test: [2m      Tests [22m [1m[32m55 passed[39m[22m[90m (55)[39m
2026-05-16T02:29:44.4439222Z packages/game-logic test: [2m   Start at [22m 02:29:41
2026-05-16T02:29:44.4462541Z packages/game-logic test: [2m   Duration [22m 2.88s[2m (transform 230ms, setup 0ms, import 469ms, tests 103ms, environment 2ms)[22m
2026-05-16T02:29:44.4702029Z packages/game-logic test: Done
2026-05-16T02:29:44.7052220Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-16T02:29:44.8849961Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T02:29:45.0627609Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T02:29:45.2232566Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T02:29:45.2268704Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-16T02:29:45.2270962Z packages/protocol test: [2m      Tests [22m [1m[32m36 passed[39m[22m[90m (36)[39m
2026-05-16T02:29:45.2272886Z packages/protocol test: [2m   Start at [22m 02:29:44
2026-05-16T02:29:45.2274765Z packages/protocol test: [2m   Duration [22m 864ms[2m (transform 118ms, setup 0ms, import 242ms, tests 38ms, environment 1ms)[22m
2026-05-16T02:29:45.2585126Z packages/protocol test: Done
2026-05-16T02:29:45.2591066Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-16T02:29:45.2594014Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-16T02:29:45.8160516Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-16T02:29:45.8950204Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-16T02:29:46.9470272Z apps/server test: {"level":30,"time":1778898586943,"pid":4824,"hostname":"runnervmrw5os","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-16T02:29:46.9508862Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 763[2mms[22m[39m
2026-05-16T02:29:46.9540181Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 617[2mms[22m[39m
2026-05-16T02:29:47.5363266Z apps/server test:  [32m✓[39m test/layout-derive.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 212[2mms[22m[39m
2026-05-16T02:29:48.1367886Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-16T02:29:48.1390100Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-16T02:29:48.2200067Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 243[2mms[22m[39m
2026-05-16T02:29:48.7261820Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 66[2mms[22m[39m
2026-05-16T02:29:49.5690469Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.teleport-gate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 125[2mms[22m[39m
2026-05-16T02:29:49.6476735Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-16T02:29:49.6498736Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-uk5NIU/rebno.db
2026-05-16T02:29:49.6500560Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T02:29:49.6501697Z apps/server test: [run-migrations] OK
2026-05-16T02:29:49.6621017Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-16T02:29:49.6637458Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-Nncp6J/rebno.db
2026-05-16T02:29:49.6640348Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T02:29:49.6644046Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-16T02:29:49.6646659Z apps/server test: [run-migrations] OK
2026-05-16T02:29:49.6720747Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-16T02:29:49.6746237Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-KRf2GA/rebno.db
2026-05-16T02:29:49.6759434Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T02:29:49.6761986Z apps/server test: [run-migrations] OK
2026-05-16T02:29:49.6764190Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-16T02:29:49.6767459Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-KRf2GA/rebno.db
2026-05-16T02:29:49.6771085Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T02:29:49.6773524Z apps/server test: [run-migrations] OK
2026-05-16T02:29:49.6829434Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 56[2mms[22m[39m
2026-05-16T02:29:50.0005619Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 24[2mms[22m[39m
2026-05-16T02:29:50.3118495Z apps/server test: {"level":40,"time":1778898590307,"pid":4938,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T02:29:50.3200066Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-16T02:29:50.3243741Z apps/server test: {"level":40,"time":1778898590312,"pid":4938,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T02:29:50.3246064Z apps/server test: {"level":40,"time":1778898590313,"pid":4938,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T02:29:50.6280340Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-16T02:29:50.8529103Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 151[2mms[22m[39m
2026-05-16T02:29:50.9286534Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 28[2mms[22m[39m
2026-05-16T02:29:51.8499916Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-16T02:29:51.8502375Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌁ auth for agents [www.vestauth.com]
2026-05-16T02:29:51.8519324Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-16T02:29:52.1700484Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 118[2mms[22m[39m
2026-05-16T02:29:52.6220807Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T02:29:52.9105363Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-16T02:29:53.1644993Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T02:29:53.4016511Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 133[2mms[22m[39m
2026-05-16T02:29:53.4150301Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T02:29:53.4219621Z apps/server test: [2m Test Files [22m [1m[32m12 passed[39m[22m[90m (12)[39m
2026-05-16T02:29:53.4250797Z apps/server test: [2m      Tests [22m [1m[32m70 passed[39m[22m[90m (70)[39m
2026-05-16T02:29:53.4306336Z apps/server test: [2m   Start at [22m 02:29:45
2026-05-16T02:29:53.4316389Z apps/server test: [2m   Duration [22m 7.58s[2m (transform 625ms, setup 0ms, import 3.58s, tests 1.23s, environment 2ms)[22m
2026-05-16T02:29:53.4677633Z apps/server test: Done
2026-05-16T02:29:54.1938580Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 80[2mms[22m[39m
2026-05-16T02:29:54.9642044Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 78[2mms[22m[39m
2026-05-16T02:29:55.7203409Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 43[2mms[22m[39m
2026-05-16T02:29:56.4362543Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 34[2mms[22m[39m
2026-05-16T02:29:57.1615551Z apps/client test:  [32m✓[39m src/__test__/nameplate-stability.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-16T02:29:57.8870458Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 21[2mms[22m[39m
2026-05-16T02:29:58.6045609Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-16T02:29:59.3513933Z apps/client test:  [32m✓[39m src/__test__/player-renderer.teleport.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-16T02:30:00.0633370Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-16T02:30:00.8113810Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-16T02:30:01.5078867Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T02:30:02.2027421Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-16T02:30:02.9152813Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T02:30:03.6189753Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T02:30:04.3296283Z apps/client test:  [32m✓[39m src/__test__/boot-font-gate.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T02:30:05.0385568Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T02:30:05.7358848Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T02:30:06.4156790Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T02:30:07.1206781Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T02:30:07.8134843Z apps/client test:  [32m✓[39m src/__test__/room-renderer.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T02:30:08.5253220Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T02:30:09.2118750Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T02:30:09.9053611Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T02:30:10.6531027Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T02:30:11.3769929Z apps/client test:  [32m✓[39m src/__test__/legacy-origin.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T02:30:12.0749274Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T02:30:12.0979993Z apps/client test: [2m Test Files [22m [1m[32m31 passed[39m[22m[90m (31)[39m
2026-05-16T02:30:12.0994789Z apps/client test: [2m      Tests [22m [1m[32m213 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (217)[39m
2026-05-16T02:30:12.0996184Z apps/client test: [2m   Start at [22m 02:29:45
2026-05-16T02:30:12.1000980Z apps/client test: [2m   Duration [22m 26.20s[2m (transform 981ms, setup 71ms, collect 1.70s, tests 1.20s, environment 15.14s, prepare 2.92s)[22m
2026-05-16T02:30:12.2398830Z apps/client test: Done
2026-05-16T02:30:12.2504776Z 
2026-05-16T02:30:12.2505885Z verify-phase-4: OK (12 steps green)
2026-05-16T02:30:12.2631030Z 
2026-05-16T02:30:12.2631875Z === Workspace: typecheck ===
2026-05-16T02:30:12.2632910Z >>> pnpm -r typecheck
2026-05-16T02:30:12.5907013Z Scope: 5 of 6 workspace projects
2026-05-16T02:30:12.5966395Z packages/db typecheck$ tsc --noEmit
2026-05-16T02:30:12.5975621Z packages/game-logic typecheck$ tsc --noEmit
2026-05-16T02:30:15.2189476Z packages/game-logic typecheck: Done
2026-05-16T02:30:15.2209189Z packages/protocol typecheck$ tsc --noEmit
2026-05-16T02:30:17.6155123Z packages/db typecheck: Done
2026-05-16T02:30:18.9666340Z packages/protocol typecheck: Done
2026-05-16T02:30:18.9672512Z apps/client typecheck$ tsc --noEmit
2026-05-16T02:30:18.9675760Z apps/server typecheck$ tsc --noEmit
2026-05-16T02:30:31.9563190Z apps/client typecheck: Done
2026-05-16T02:30:32.4845038Z apps/server typecheck: Done
2026-05-16T02:30:32.4947026Z 
2026-05-16T02:30:32.4947782Z === Lint: deploy-stack ===
2026-05-16T02:30:32.4949719Z >>> pnpm lint:deploy-stack
2026-05-16T02:30:32.8166774Z 
2026-05-16T02:30:32.8167627Z > rebno@0.0.0 lint:deploy-stack /home/runner/work/rebno/rebno
2026-05-16T02:30:32.8168656Z > node tools/scripts/lint-deploy-stack.mjs
2026-05-16T02:30:32.8169051Z 
2026-05-16T02:30:32.8487476Z lint-deploy-stack: OK
2026-05-16T02:30:32.8623792Z 
2026-05-16T02:30:32.8624630Z === Lint: deploy-stack test ===
2026-05-16T02:30:32.8625758Z >>> pnpm lint:deploy-stack:test
2026-05-16T02:30:33.1862837Z 
2026-05-16T02:30:33.1864002Z > rebno@0.0.0 lint:deploy-stack:test /home/runner/work/rebno/rebno
2026-05-16T02:30:33.1865377Z > node tools/scripts/lint-deploy-stack.test.mjs
2026-05-16T02:30:33.1866114Z 
2026-05-16T02:30:33.2529825Z PASS: lint-deploy-stack green
2026-05-16T02:30:33.2665760Z 
2026-05-16T02:30:33.2666556Z === ADR 0005 lint ===
2026-05-16T02:30:33.2667573Z >>> pnpm lint:adr:0005
2026-05-16T02:30:33.5913443Z 
2026-05-16T02:30:33.5914324Z > rebno@0.0.0 lint:adr:0005 /home/runner/work/rebno/rebno
2026-05-16T02:30:33.5915722Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0005-deploy-topology.md --no-matrix
2026-05-16T02:30:33.5916685Z 
2026-05-16T02:30:33.6235903Z OK: ADR docs/adr/0005-deploy-topology.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-16T02:30:33.6359069Z 
2026-05-16T02:30:33.6361984Z === ADR 0006 lint ===
2026-05-16T02:30:33.6362732Z >>> pnpm lint:adr:0006
2026-05-16T02:30:33.9569382Z 
2026-05-16T02:30:33.9570748Z > rebno@0.0.0 lint:adr:0006 /home/runner/work/rebno/rebno
2026-05-16T02:30:33.9572716Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0006-observability-stack.md --no-matrix
2026-05-16T02:30:33.9573937Z 
2026-05-16T02:30:33.9880569Z OK: ADR docs/adr/0006-observability-stack.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-16T02:30:34.0012746Z 
2026-05-16T02:30:34.0013652Z === Workspace: test ===
2026-05-16T02:30:34.0024930Z >>> pnpm -r test
2026-05-16T02:30:34.3273079Z Scope: 5 of 6 workspace projects
2026-05-16T02:30:34.3331811Z packages/db test$ vitest run
2026-05-16T02:30:34.3340319Z packages/game-logic test$ vitest run
2026-05-16T02:30:34.8814937Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-16T02:30:34.8818257Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-16T02:30:35.3084854Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 18[2mms[22m[39m
2026-05-16T02:30:35.5566722Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-16T02:30:35.7989675Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-16T02:30:35.9042039Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-16T02:30:36.0589718Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T02:30:36.3181034Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T02:30:36.5266425Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T02:30:36.7469612Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T02:30:36.7582109Z packages/game-logic test:  [32m✓[39m test/sprite-state-machine.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T02:30:37.0035960Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T02:30:37.0038651Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T02:30:37.0040694Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-16T02:30:37.0042112Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-16T02:30:37.0043773Z packages/db test: [2m   Start at [22m 02:30:34
2026-05-16T02:30:37.0045508Z packages/db test: [2m   Duration [22m 2.11s[2m (transform 189ms, setup 0ms, import 1.46s, tests 32ms, environment 1ms)[22m
2026-05-16T02:30:37.0267831Z packages/db test: Done
2026-05-16T02:30:37.0273341Z packages/protocol test$ vitest run
2026-05-16T02:30:37.2544792Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T02:30:37.4750301Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T02:30:37.5884777Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-16T02:30:37.7080361Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T02:30:37.7129528Z packages/game-logic test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-16T02:30:37.7145151Z packages/game-logic test: [2m      Tests [22m [1m[32m55 passed[39m[22m[90m (55)[39m
2026-05-16T02:30:37.7169214Z packages/game-logic test: [2m   Start at [22m 02:30:34
2026-05-16T02:30:37.7171130Z packages/game-logic test: [2m   Duration [22m 2.84s[2m (transform 239ms, setup 0ms, import 476ms, tests 102ms, environment 2ms)[22m
2026-05-16T02:30:37.7479186Z packages/game-logic test: Done
2026-05-16T02:30:37.9507496Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-16T02:30:38.1272757Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T02:30:38.3047476Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T02:30:38.4633651Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T02:30:38.4660530Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-16T02:30:38.4672556Z packages/protocol test: [2m      Tests [22m [1m[32m36 passed[39m[22m[90m (36)[39m
2026-05-16T02:30:38.4674105Z packages/protocol test: [2m   Start at [22m 02:30:37
2026-05-16T02:30:38.4676008Z packages/protocol test: [2m   Duration [22m 869ms[2m (transform 108ms, setup 0ms, import 230ms, tests 37ms, environment 0ms)[22m
2026-05-16T02:30:38.4993376Z packages/protocol test: Done
2026-05-16T02:30:38.4999549Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-16T02:30:38.5002608Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-16T02:30:39.0680736Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-16T02:30:39.1230063Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-16T02:30:40.1655498Z apps/server test: {"level":30,"time":1778898640161,"pid":6054,"hostname":"runnervmrw5os","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-16T02:30:40.1699672Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 738[2mms[22m[39m
2026-05-16T02:30:40.1714934Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 614[2mms[22m[39m
2026-05-16T02:30:40.5891006Z apps/server test:  [32m✓[39m test/layout-derive.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 156[2mms[22m[39m
2026-05-16T02:30:41.2621353Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-16T02:30:41.2640009Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-16T02:30:41.3461433Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 245[2mms[22m[39m
2026-05-16T02:30:41.7489680Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 82[2mms[22m[39m
2026-05-16T02:30:42.5954841Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 134[2mms[22m[39m
2026-05-16T02:30:42.7336015Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-16T02:30:42.7359566Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-nWFXxT/rebno.db
2026-05-16T02:30:42.7364567Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T02:30:42.7370204Z apps/server test: [run-migrations] OK
2026-05-16T02:30:42.7494300Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-16T02:30:42.7509576Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-o5H6pH/rebno.db
2026-05-16T02:30:42.7522750Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T02:30:42.7526245Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-16T02:30:42.7537891Z apps/server test: [run-migrations] OK
2026-05-16T02:30:42.7641297Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-16T02:30:42.7643797Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-Dge8Mi/rebno.db
2026-05-16T02:30:42.7650682Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T02:30:42.7651979Z apps/server test: [run-migrations] OK
2026-05-16T02:30:42.7658370Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-16T02:30:42.7661792Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-Dge8Mi/rebno.db
2026-05-16T02:30:42.7664852Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T02:30:42.7666822Z apps/server test: [run-migrations] OK
2026-05-16T02:30:42.7718778Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 64[2mms[22m[39m
2026-05-16T02:30:43.1020293Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 30[2mms[22m[39m
2026-05-16T02:30:43.3807264Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 24[2mms[22m[39m
2026-05-16T02:30:43.6800808Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-16T02:30:43.8270263Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 135[2mms[22m[39m
2026-05-16T02:30:43.9590117Z apps/server test: {"level":40,"time":1778898643952,"pid":6179,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T02:30:43.9749620Z apps/server test: {"level":40,"time":1778898643963,"pid":6179,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T02:30:43.9769592Z apps/server test: {"level":40,"time":1778898643964,"pid":6179,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T02:30:43.9831603Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 30[2mms[22m[39m
2026-05-16T02:30:44.2521550Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-16T02:30:44.5254019Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-16T02:30:45.2790396Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.teleport-gate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 137[2mms[22m[39m
2026-05-16T02:30:45.4541159Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-16T02:30:45.4559715Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌁ auth for agents [www.vestauth.com]
2026-05-16T02:30:45.4593996Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-16T02:30:46.2163612Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T02:30:46.4545572Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 120[2mms[22m[39m
2026-05-16T02:30:46.4801911Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T02:30:46.4891731Z apps/server test: [2m Test Files [22m [1m[32m12 passed[39m[22m[90m (12)[39m
2026-05-16T02:30:46.4914913Z apps/server test: [2m      Tests [22m [1m[32m70 passed[39m[22m[90m (70)[39m
2026-05-16T02:30:46.4923749Z apps/server test: [2m   Start at [22m 02:30:39
2026-05-16T02:30:46.4925550Z apps/server test: [2m   Duration [22m 7.41s[2m (transform 583ms, setup 0ms, import 3.54s, tests 1.18s, environment 2ms)[22m
2026-05-16T02:30:46.5372690Z apps/server test: Done
2026-05-16T02:30:47.2377266Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 79[2mms[22m[39m
2026-05-16T02:30:48.0072803Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 73[2mms[22m[39m
2026-05-16T02:30:48.7567284Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 47[2mms[22m[39m
2026-05-16T02:30:49.4815846Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 34[2mms[22m[39m
2026-05-16T02:30:50.1977149Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 22[2mms[22m[39m
2026-05-16T02:30:50.9026226Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-16T02:30:51.6201473Z apps/client test:  [32m✓[39m src/__test__/nameplate-stability.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-16T02:30:52.3351463Z apps/client test:  [32m✓[39m src/__test__/player-renderer.teleport.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-16T02:30:53.0547318Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-16T02:30:53.8010611Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-16T02:30:54.5025041Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-16T02:30:55.2163615Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T02:30:55.9106101Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T02:30:56.5940645Z apps/client test:  [32m✓[39m src/__test__/boot-font-gate.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T02:30:57.2995322Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T02:30:58.0052218Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T02:30:58.7035374Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T02:30:59.4005182Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T02:31:00.0919371Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T02:31:00.8012458Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T02:31:01.4983254Z apps/client test:  [32m✓[39m src/__test__/room-renderer.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T02:31:02.1827176Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T02:31:02.8630278Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T02:31:03.5651125Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T02:31:04.2504231Z apps/client test:  [32m✓[39m src/__test__/legacy-origin.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T02:31:04.9373812Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T02:31:04.9627957Z apps/client test: [2m Test Files [22m [1m[32m31 passed[39m[22m[90m (31)[39m
2026-05-16T02:31:04.9649585Z apps/client test: [2m      Tests [22m [1m[32m213 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (217)[39m
2026-05-16T02:31:04.9653437Z apps/client test: [2m   Start at [22m 02:30:39
2026-05-16T02:31:04.9659030Z apps/client test: [2m   Duration [22m 25.84s[2m (transform 941ms, setup 81ms, collect 1.66s, tests 1.20s, environment 14.99s, prepare 2.85s)[22m
2026-05-16T02:31:05.1061313Z apps/client test: Done
2026-05-16T02:31:05.1139389Z 
2026-05-16T02:31:05.1140049Z verify-phase-5: OK (7 steps green)
